<?php
#[Table('news_category')]
#[PrimaryKey('id')]
class Areas_News_Models_NewsCategory extends XPHP_Model
{
    public $id;
    #[Label('Tên danh mục')]
    #[Required(message = 'Tên danh mục bắt buộc nhập')]
    #[MaxLength(255, message = 'Tên danh mục có tối đa 255 kí tự')]
    public $name;
    #[Label('Danh mục cha')]
    public $parent_id;
    #[Label('Thứ tự hiển thị')]
    public $sort;
    #[Label('Ngôn ngữ')]
    public $lang_id;
    /**
     * Lấy ra cây thư mục tính từ danh mục gốc
     * @return array
     */
    public function getCategoryTree ($parent_id = 0)
    {
        return $this->_getCategoryTree($parent_id);
    }
    /**
     * Danh mục category sắp xếp hiển thị theo dạng cây
     * @var string
     */
    private $_categoryList = array();
    /**
     * Đánh dấu cấp độ của danh mục
     * @var int
     */
    private $_categoryLevel = 1;
    /**
     * Phương thức đệ quy lấy ra danh mục tin tức dạng cây
     * @param int $parent_id
     */
    private function _getCategoryTree ($parent_id)
    {
        //Lấy ra toàn bộ danh mục sản phẩm con của danh mục parent
        $categories = $this->db->where('parent_id', $parent_id)
            ->order_by('sort', 'asc')
            ->get()
            ->result();
        //Dấu gạch biểu thị cấp độ
        $prefix = "";
        for ($i = 0; $i < $this->_categoryLevel; $i ++) {
            $prefix .= " ------ ";
        }
        if (count($categories) > 0) {
            foreach ($categories as $category) {
                $category->name = $prefix . $category->name;
                $this->_categoryList[] = $category;
                if ($this->countSubCategory($category->id)) {
                    $this->_categoryLevel ++;
                    $this->_getCategoryTree($category->id);
                    $this->_categoryLevel --;
                }
            }
        }
        return $this->_categoryList;
    }
    /**
     * Phương thức lấy ra số danh mục con của một danh mục
     * @param int $parent_id
     */
    public function countSubCategory ($parent_id)
    {
        //Lấy ra toàn bộ danh mục sản phẩm con của danh mục parent
        $categories = $this->db->where('parent_id', $parent_id)
            ->get()
            ->result();
        return count($categories);
    }
    /**
     * Kiểm tra xem có tồn tại một danh mục có tồn tại hay không ?
     * @param $options array
     * @return boolean
     */
    public function exists ($options)
    {
        foreach ($options as $field => $value) {
            $this->db->where($field, $value);
        }
        return count($this->db->get()->result()) > 0;
    }
    /**
     * Phương thức insert một danh mục mới vào database
     */
    public function insert ()
    {
        $data['name'] = $this->name;
        $data['parent_id'] = $this->parent_id;
        $data['lang_id'] = $this->lang_id;
        $data['sort'] = $this->sort;
        return $this->db->insert($data);
    }
    /**
     * Phương thức update một danh mục
     */
    public function update ()
    {
        $data['name'] = $this->name;
        $data['parent_id'] = $this->parent_id;
        $data['lang_id'] = $this->lang_id;
        $data['sort'] = $this->sort;
        return $this->db->where('id', $this->id)->update($data);
    }
    /**
     * Phương thức xóa một danh mục
     */
    public function delete()
    {
        return $this->db->where('id', $this->id)->delete();
    }
    /**
     * Lấy ra danh mục đa cấp
     * @return array
     */
    public function getCategoryMultiLevel ()
    {
        return $this->_getCategoryMultiLevel(0);
    }
    /**
     * Phương thức đệ quy lấy ra danh mục đa cấp
     * @param int $parent_id
     */
    private function _getCategoryMultiLevel ($parent_id)
    {
        //Lấy ra toàn bộ danh mục sản phẩm con của danh mục parent
        $categories = $this->db->where('parent_id', $parent_id)
        	->where('lang_id', $_SESSION['lang_id'])
            ->order_by('sort', 'asc')
            ->get()
            ->result();
        if (count($categories) > 0) {
            for ($i = 0; $i < count($categories); $i ++) {
                if ($this->countSubCategory($categories[$i]->id)) {
                    $categories[$i]->subs = $this->_getCategoryMultiLevel(
                    $categories[$i]->id);
                }
            }
        }
        return $categories;
    }
    
    /**
     * Lấy ra danh mục với các điều kiên
     * @param array $options
     */
    public function getCategories($options = array())
    {
        //Set where
        foreach ($options as $field => $value)
        {
            $this->db->where($field, $value);
        }
        return $this->db->get()->result();
    }
}